// components/tech-params-uploader/tech-params-uploader.ts
import { uploadTechParams } from '../../api/upload.js'

interface FileData {
  url: string;
  name: string;
  size?: number;
  path?: string;
}

Component({
  /**
   * 组件的属性列表
   */
  properties: {
    // 已上传的文件数据
    fileData: {
      type: Object,
      value: null
    },
    // 是否显示提示文字
    showHint: {
      type: Boolean,
      value: true
    },
    // 提示文字
    hintText: {
      type: String,
      value: '从聊天记录选择文件，可保留原始文件名\n支持JPG、PNG、PDF格式，文件大小不超过10MB'
    },
    // 上传按钮文字
    uploadText: {
      type: String,
      value: '从聊天记录选择文件'
    },
    // 上传区域图标
    uploadIcon: {
      type: String,
      value: 'fa fa-cloud-upload-alt'
    },
    // 文件图标
    fileIcon: {
      type: String,
      value: 'fa fa-file-alt'
    },
    // 是否禁用
    disabled: {
      type: Boolean,
      value: false
    }
  },

  /**
   * 组件的初始数据
   */
  data: {
    uploading: false
  },

  /**
   * 组件的方法列表
   */
  methods: {
    // 选择并上传文件
    async chooseAndUploadFile() {
      if (this.properties.disabled) {
        return;
      }

      // 如果已有文件，提示是否替换
      if (this.properties.fileData) {
        const res = await new Promise<boolean>((resolve) => {
          wx.showModal({
            title: '提示',
            content: '已有技术参数文件，是否替换？',
            success: (res) => {
              resolve(res.confirm);
            }
          });
        });
        
        if (!res) {
          return;
        }
      }

      // 直接从聊天记录选择文件（支持图片和文档）
      try {
        // 显示提示
        const confirmRes = await new Promise<boolean>((resolve) => {
          wx.showModal({
            title: '选择文件',
            content: '请从聊天记录中选择文件（支持图片、PDF格式）\n\n💡 提示：先将文件发送到"文件传输助手"，再从聊天记录中选择',
            showCancel: true,
            confirmText: '继续选择',
            cancelText: '取消',
            success: (res) => {
              resolve(res.confirm);
            },
            fail: () => {
              resolve(false);
            }
          });
        });

        if (!confirmRes) {
          return; // 用户取消
        }

        // 从聊天记录选择文件
        const res = await wx.chooseMessageFile({
          count: 1,
          type: 'file',
          extension: ['jpg', 'png', 'jpeg', 'pdf']
        }) as any;
        
        if (res.tempFiles && res.tempFiles.length > 0) {
          const tempFile = res.tempFiles[0];
          
          console.log('选择的文件（聊天记录）:', {
            path: tempFile.path,
            name: tempFile.name,
            size: tempFile.size,
            note: '✅ 保留了原始文件名'
          });
          
          await this.uploadFile({
            path: tempFile.path,
            size: tempFile.size,
            name: tempFile.name  // ✅ 使用原始文件名
          });
        }
      } catch (error: any) {
        console.error('选择文件失败:', error);
        
        // 如果是用户取消操作，不显示错误提示
        if (error.errMsg && !error.errMsg.includes('cancel')) {
          wx.showToast({
            title: '选择文件失败',
            icon: 'none'
          });
        }
      }
    },

    // 上传文件
    async uploadFile(file: any) {
      try {
        console.log('准备上传文件:', {
          path: file.path,
          name: file.name,
          size: file.size
        });
        
        // 检查文件大小（最大10MB）
        if (file.size > 10 * 1024 * 1024) {
          wx.showToast({
            title: '文件大小不能超过10MB',
            icon: 'none'
          });
          return;
        }
        
        this.setData({ uploading: true });
        wx.showLoading({ title: '上传中...' });
        
        // 调用上传API，传递文件名
        console.log('调用uploadTechParams，文件名:', file.name);
        const uploadResult = await uploadTechParams(file.path, () => {}, file.name);
        
        wx.hideLoading();
        
        if (uploadResult.code === 200 && uploadResult.data) {
          const fileData: FileData = {
            url: uploadResult.data.url,
            name: uploadResult.data.name || file.name,
            size: uploadResult.data.size || file.size,
            path: file.path
          };
          
          this.setData({ uploading: false });
          
          // 触发上传成功事件
          this.triggerEvent('upload-success', {
            fileData: fileData
          });
          
          wx.showToast({
            title: '技术参数上传成功',
            icon: 'success'
          });
        } else {
          throw new Error(uploadResult.msg || '上传失败');
        }
      } catch (error: any) {
        console.error('上传技术参数失败:', error);
        this.setData({ uploading: false });
        wx.hideLoading();
        
        // 如果是用户取消操作，不显示错误提示
        if (error.errMsg && (error.errMsg.includes('cancel') || error.errMsg === 'chooseMessageFile:fail cancel')) {
          console.log('用户取消选择文件');
          return;
        }
        
        wx.showToast({
          title: typeof(error) === 'string' ? error : (error?.errMsg || error?.message || '上传失败'),
          icon: 'none'
        });
      }
    },

    // 删除文件
    removeFile() {
      if (this.properties.disabled) {
        return;
      }

      wx.showModal({
        title: '提示',
        content: '确定要删除技术参数文件吗？',
        success: (res) => {
          if (res.confirm) {
            // 触发删除事件
            this.triggerEvent('remove', {
              fileData: this.properties.fileData
            });
          }
        }
      });
    }
  }
});

